home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldbmp08
/
ldbmp08s.lzh
/
LDBMP8.S
< prev
next >
Wrap
Text File
|
1997-06-12
|
30KB
|
1,563 lines
*****************************************************************
* 256色のBMP *
*****************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xdef _Rle8_extend
.xdef _Bit8_conv
.xdef _Bit8_prt
.xdef _Bit8_scroll
.xdef _Bit8_rewrite
.xref _Wait
.xref _PageSync
.xref pal_set0
.xref key_chk
.xref tenkey_chk
.xref cursor_chk
.xref mouse_chk
.xref x_set
.xref y_set
.xref inf_change
.xref line_byte
.xref tate
.xref yoko
.xref x_max
.xref y_max
.xref x_pos
.xref y_pos
.xref os_type
.xref gr_addr
.xref fi_size
.xref buff_addr
.xref pal_addr
.xref kflg
.xref dflg
.xref d_pat
.xref esc_flg
.xref next_flg
.xref inkey_flg3
.xref scroll_key
.xref s_dot8
WIN3 equ 40
OS2v1 equ 12
OS2v2 equ 64
.text
.even
*****************************************************************
* RLE8展開 *
*****************************************************************
_Rle8_extend:
bsr tenkai
rts
*****************************************************************
* 32kデータに変換 *
*****************************************************************
_Bit8_conv:
bsr convert
rts
*****************************************************************
* 256色表示 *
*****************************************************************
_Bit8_prt:
bsr front_line_set *表側に表示する横ドット数を求める
bsr back_line_set *裏側に表示する横ドット数を求める
bsr y_line_set *表示する縦ドット数を求める
bsr bit8_prt *表示
rts
*****************************************************************
* 256色スクロール *
*****************************************************************
_Bit8_scroll:
bsr scroll
rts
*****************************************************************
* 画面の描き直し *
*****************************************************************
_Bit8_rewrite:
bsr esc_rewrite
rts
*****************************************************************
* ランレングス圧縮の展開 *
*****************************************************************
tenkai:
move.l gr_addr(pc),a0 *展開元
move.l buff_addr(pc),a1
adda.l fi_size(pc),a1
movea.l a1,a2 *展開元MAX
move.l a1,d0 *展開先補正
btst.l #0,d0
beq tenkai_
addq.l #1,a1
tenkai_:
move.l a1,gr_addr *画像アドレス変更
movea.l a1,a3 *取っておく
tenkai0:
cmpa.l a0,a2
bls tenkai9
moveq.l #0,d0
move.b (a0)+,d0
beq tenkai2
move.b (a0)+,d1
subq.w #1,d0
tenkai1:
move.b d1,(a1)+
dbra.w d0,tenkai1
bra tenkai0
tenkai2:
moveq.l #0,d0
move.b (a0)+,d0
cmp.b #1,d0
bcs tenkai5
beq tenkai9
* cmp.b #2,d0 *無視
* bne tenkai2_
* addq.l #2,a0
* bra tenkai0_
tenkai2_:
btst.l #0,d0 *偶数か
bne tenkai4 *違う
tenkai3:
subq.w #1,d0
tenkai3_:
move.b (a0)+,(a1)+
dbra.w d0,tenkai3_
bra tenkai0
tenkai4:
subq.w #1,d0
tenkai4_:
move.b (a0)+,(a1)+
dbra.w d0,tenkai4_
addq.l #1,a0
bra tenkai0
tenkai5:
adda.w line_byte(pc),a3 *展開アドレスの補正
movea.l a3,a1
bra tenkai0
tenkai9:
rts
*****************************************************************
* 32kデータに変換 *
*****************************************************************
convert:
tst.b dflg
bne convert_
movea.l pal_addr(pc),a0 *パレットアドレス
movea.l a0,a1
movea.l a0,a3
bsr pal_set0
movea.l a3,a0
bra convert__
convert_:
bsr d_pal
convert__:
clr.w bmp_x *変換元アドレス取得
clr.w bmp_y
bsr get_bmp_addr
move.w tate(pc),d0 *変換先アドレス取得
mulu.w line_byte(pc),d0
move.w tate(pc),d1
subq.w #1,d1
mulu.w yoko(pc),d1
add.l d1,d1
move.l gr_addr(pc),a2
add.l d0,a2
add.l d1,a2
add.l d0,gr_addr
move.w line_byte(pc),d0 *次のラインへの差分
add.w yoko(pc),d0 *(変換元)
movea.w d0,a3
move.w yoko(pc),d0 *次のラインへの差分
add.w d0,d0 *(変換先)
move.w d0,line_byte *ついでに1ラインのバイト数を修正
add.w d0,d0
movea.w d0,a4
move.w yoko(pc),d5 *横ループ
move.w tate(pc),d6 *縦ループ
subq.w #1,d5
subq.w #1,d6
tst.b dflg
bne convert2
convert0: *ノーマル
move.w d5,d7
convert1:
moveq.l #0,d1
move.b (a1)+,d1
add.w d1,d1
move.w 0(a0,d1.w),(a2)+
dbra d7,convert1
sub.l a3,a1
sub.l a4,a2
dbra d6,convert0
rts
convert2: *ディザ
lea.l dpal_buf(pc),a0
moveq.l #0,d2
move.w #512,d3
move.w #$07ff,d4
move.w #2048,a6
convert3:
lea.l (a0,d2.w),a5
move.w d5,d7
moveq.l #0,d0
convert4:
moveq.l #0,d1
move.b (a1)+,d1
add.w d1,d1
add.w d0,d1
move.w 0(a5,d1.w),(a2)+
add.w d3,d0
and.w d4,d0
dbra d7,convert4
sub.l a3,a1
sub.l a4,a2
add.w a6,d2
andi.w #$1fff,d2
dbra d6,convert3
rts
*****************************************************************
* ディザ表示用パレットテーブル作成 *
*****************************************************************
d_pal:
cmp.w #WIN3,os_type
bne d_pal_
lea.l d_pal5(pc),a4
bra d_pal0
d_pal_:
lea.l d_pal5_(pc),a4
d_pal0:
movea.l pal_addr(pc),a0 *パレットアドレス
lea.l dpal_buf(pc),a1
lea.l d_pat(pc),a2
movea.l a0,a3
move.w #$00f8,d7 *マスクデータ
move.w #$f800,d3
move.w #$07c0,d4
moveq.l #16-1,d5 *ループ2
d_pal1:
move.w #256-1,d6 *ループ1
move.b (a2),d0
d_pal2:
move.b (a0)+,d1 *B
add.b d0,d1
bcc d_pal2_
moveq.l #31*2,d1
bra d_pal3
d_pal2_:
and.w d7,d1
lsr.b #2,d1
d_pal3:
move.b (a0)+,d2 *G
add.b d0,d2
bcc d_pal3_
or.w d3,d1
bra d_pal4
d_pal3_:
and.w d7,d2
* ror.w #8,d2
move.b d2,-(sp) *ror.w #8,d2の代わり
move.w (sp)+,d2 *
clr.b d2 *
or.w d2,d1
d_pal4
move.b (a0)+,d2 *R
add.b d0,d2
bcc d_pal4_
or.w d4,d1
bra d_pal5
d_pal4_
and.w d7,d2
rol.w #3,d2
or.w d2,d1
jmp (a4)
d_pal5 *Win3
move.w d1,(a1)+
addq.l #1,a0
dbra d6,d_pal2
movea.l a3,a0
addq.l #1,a2
dbra d5,d_pal1
rts
d_pal5_ *OS/2 V1
move.w d1,(a1)+
dbra d6,d_pal2
movea.l a3,a0
addq.l #1,a2
dbra d5,d_pal1
rts
*****************************************************************
* 表側に表示する横ドット数を求める *
*****************************************************************
front_line_set:
move.w x_pos(pc),d0
add.w yoko(pc),d0
cmp.w #512,d0
bhi front_line1
move.w yoko(pc),x_line
bra front_line2
front_line1:
move.w #512,d0
sub.w x_pos(pc),d0
move.w d0,x_line
front_line2:
rts
*****************************************************************
* 裏側に表示する横ドット数を求める *
*****************************************************************
back_line_set:
clr.w x_line_bk
clr.w x_sabun_bk
clr.w x_pos_bk
move.w x_pos(pc),d0 *裏画面を表示するか
add.w yoko(pc),d0 *page0の左半分(左256dot)に収まるとき
cmp.w #256,d0 *裏画面は表示しない
bls back_line4
move.w x_pos(pc),d0 *表画面は右半分(右256dot)から表示しているか
sub.w #256,d0
bmi back_line2 *違う
back_line1: *表画面の右側から表示
move.w d0,x_pos_bk
move.w yoko(pc),d0
cmp.w x_line(pc),d0
bhi back_line1_
move.w x_line(pc),x_line_bk
bra back_line1__
back_line1_:
move.w yoko(pc),x_line_bk
back_line1__:
* clr.w x_sabun_bk
bra back_line4
back_line2: *表画面の左側から右側に表示
move.w yoko(pc),d0
cmp.w #768,d0
bls back_line3
move.w #768,d0
back_line3:
move.w #256,d1
sub.w x_pos(pc),d1
move.w d1,x_sabun_bk
sub.w d1,d0
move.w d0,x_line_bk
* clr.w x_pos_bk
back_line4:
rts
*****************************************************************
* 縦方向の表示する長さを求める *
*****************************************************************
y_line_set:
move.w tate(pc),d0
cmp.w #512,d0
bcs y_line1
move.w #512,d0
y_line1:
move.w d0,bmp_yd *bmp_ydot数
move.w d0,y_line
rts
*****************************************************************
* 表示 *
*****************************************************************
bit8_prt:
tst.w x_line_bk *裏画面を表示するか
beq bit8_prt1 *しない
move.w x_pos_bk(pc),gram_x *表示座標
move.w y_pos(pc),gram_y
move.w x_sabun_bk(pc),bmp_x *表示範囲(x,y)
clr.w bmp_y
move.w x_line_bk(pc),bmp_xd
move.w y_line(pc),bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
adda.l #$c80000,a2
bsr bit8_put
bit8_prt1:
move.w x_pos(pc),gram_x *表示座標
move.w y_pos(pc),gram_y
clr.w bmp_x *表示範囲(x,y)
clr.w bmp_y
move.w x_line(pc),bmp_xd
move.w y_line(pc),bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
adda.l #GRAM,a2
bsr bit8_put
rts
bit8_put:
move.w bmp_xd(pc),d0 *横ドット数
move.w line_byte(pc),d1 *次のラインへのバイト数
add.w d0,d1 *(転送元)
movea.w d1,a3
move.w #512,d1 *表示データの1ライン下までの差分
sub.w d0,d1 *(表示先)
add.w d1,d1
movea.w d1,a4
addq.l #1,a2 *転送先を奇数アドレスにする
move.w bmp_yd(pc),d7 *縦ループ数
subq.w #1,d7 *dbraのため-1
cmpi.b #MC68060,MPUTYPE *MC68060か
bcc bit8_put60
cmpi.w #4,d0 *転送横サイズが4未満か
bcs bit8_put60 *そう
move.l a1,d6 *転送もとが奇数アドレスか
btst.l #0,d6
bne bit8_putk
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
cmpi.b #MC68030,MPUTYPE *MC68030か
bcc bit8_put30
bit8_put00: *MC68000用
movea.l #1024,a4 *データの補正
add.w d0,a2
add.w d0,a2
lea.l bit8_put02(pc),a5 *ジャンプアドレス計算
move.w d0,d1
lsr.w #1,d1
add.w d0,d1
sub.w d1,a5
bit8_put01:
jmp (a5)
move.l (a1)+,d6
movep.l d6,-1024(a2)
move.l (a1)+,d6
movep.l d6,-1016(a2)
move.l (a1)+,d6
movep.l d6,-1008(a2)
move.l (a1)+,d6
movep.l d6,-1000(a2)
move.l (a1)+,d6
movep.l d6,-992(a2)
move.l (a1)+,d6
movep.l d6,-984(a2)
move.l (a1)+,d6
movep.l d6,-976(a2)
move.l (a1)+,d6
movep.l d6,-968(a2)
move.l (a1)+,d6
movep.l d6,-960(a2)
move.l (a1)+,d6
movep.l d6,-952(a2)
move.l (a1)+,d6
movep.l d6,-944(a2)
move.l (a1)+,d6
movep.l d6,-936(a2)
move.l (a1)+,d6
movep.l d6,-928(a2)
move.l (a1)+,d6
movep.l d6,-920(a2)
move.l (a1)+,d6
movep.l d6,-912(a2)
move.l (a1)+,d6
movep.l d6,-904(a2)
move.l (a1)+,d6
movep.l d6,-896(a2)
move.l (a1)+,d6
movep.l d6,-888(a2)
move.l (a1)+,d6
movep.l d6,-880(a2)
move.l (a1)+,d6
movep.l d6,-872(a2)
move.l (a1)+,d6
movep.l d6,-864(a2)
move.l (a1)+,d6
movep.l d6,-856(a2)
move.l (a1)+,d6
movep.l d6,-848(a2)
move.l (a1)+,d6
movep.l d6,-840(a2)
move.l (a1)+,d6
movep.l d6,-832(a2)
move.l (a1)+,d6
movep.l d6,-824(a2)
move.l (a1)+,d6
movep.l d6,-816(a2)
move.l (a1)+,d6
movep.l d6,-808(a2)
move.l (a1)+,d6
movep.l d6,-800(a2)
move.l (a1)+,d6
movep.l d6,-792(a2)
move.l (a1)+,d6
movep.l d6,-784(a2)
move.l (a1)+,d6
movep.l d6,-776(a2)
move.l (a1)+,d6
movep.l d6,-768(a2)
move.l (a1)+,d6
movep.l d6,-760(a2)
move.l (a1)+,d6
movep.l d6,-752(a2)
move.l (a1)+,d6
movep.l d6,-744(a2)
move.l (a1)+,d6
movep.l d6,-736(a2)
move.l (a1)+,d6
movep.l d6,-728(a2)
move.l (a1)+,d6
movep.l d6,-720(a2)
move.l (a1)+,d6
movep.l d6,-712(a2)
move.l (a1)+,d6
movep.l d6,-704(a2)
move.l (a1)+,d6
movep.l d6,-696(a2)
move.l (a1)+,d6
movep.l d6,-688(a2)
move.l (a1)+,d6
movep.l d6,-680(a2)
move.l (a1)+,d6
movep.l d6,-672(a2)
move.l (a1)+,d6
movep.l d6,-664(a2)
move.l (a1)+,d6
movep.l d6,-656(a2)
move.l (a1)+,d6
movep.l d6,-648(a2)
move.l (a1)+,d6
movep.l d6,-640(a2)
move.l (a1)+,d6
movep.l d6,-632(a2)
move.l (a1)+,d6
movep.l d6,-624(a2)
move.l (a1)+,d6
movep.l d6,-616(a2)
move.l (a1)+,d6
movep.l d6,-608(a2)
move.l (a1)+,d6
movep.l d6,-600(a2)
move.l (a1)+,d6
movep.l d6,-592(a2)
move.l (a1)+,d6
movep.l d6,-584(a2)
move.l (a1)+,d6
movep.l d6,-576(a2)
move.l (a1)+,d6
movep.l d6,-568(a2)
move.l (a1)+,d6
movep.l d6,-560(a2)
move.l (a1)+,d6
movep.l d6,-552(a2)
move.l (a1)+,d6
movep.l d6,-544(a2)
move.l (a1)+,d6
movep.l d6,-536(a2)
move.l (a1)+,d6
movep.l d6,-528(a2)
move.l (a1)+,d6
movep.l d6,-520(a2)
move.l (a1)+,d6
movep.l d6,-512(a2)
move.l (a1)+,d6
movep.l d6,-504(a2)
move.l (a1)+,d6
movep.l d6,-496(a2)
move.l (a1)+,d6
movep.l d6,-488(a2)
move.l (a1)+,d6
movep.l d6,-480(a2)
move.l (a1)+,d6
movep.l d6,-472(a2)
move.l (a1)+,d6
movep.l d6,-464(a2)
move.l (a1)+,d6
movep.l d6,-456(a2)
move.l (a1)+,d6
movep.l d6,-448(a2)
move.l (a1)+,d6
movep.l d6,-440(a2)
move.l (a1)+,d6
movep.l d6,-432(a2)
move.l (a1)+,d6
movep.l d6,-424(a2)
move.l (a1)+,d6
movep.l d6,-416(a2)
move.l (a1)+,d6
movep.l d6,-408(a2)
move.l (a1)+,d6
movep.l d6,-400(a2)
move.l (a1)+,d6
movep.l d6,-392(a2)
move.l (a1)+,d6
movep.l d6,-384(a2)
move.l (a1)+,d6
movep.l d6,-376(a2)
move.l (a1)+,d6
movep.l d6,-368(a2)
move.l (a1)+,d6
movep.l d6,-360(a2)
move.l (a1)+,d6
movep.l d6,-352(a2)
move.l (a1)+,d6
movep.l d6,-344(a2)
move.l (a1)+,d6
movep.l d6,-336(a2)
move.l (a1)+,d6
movep.l d6,-328(a2)
move.l (a1)+,d6
movep.l d6,-320(a2)
move.l (a1)+,d6
movep.l d6,-312(a2)
move.l (a1)+,d6
movep.l d6,-304(a2)
move.l (a1)+,d6
movep.l d6,-296(a2)
move.l (a1)+,d6
movep.l d6,-288(a2)
move.l (a1)+,d6
movep.l d6,-280(a2)
move.l (a1)+,d6
movep.l d6,-272(a2)
move.l (a1)+,d6
movep.l d6,-264(a2)
move.l (a1)+,d6
movep.l d6,-256(a2)
move.l (a1)+,d6
movep.l d6,-248(a2)
move.l (a1)+,d6
movep.l d6,-240(a2)
move.l (a1)+,d6
movep.l d6,-232(a2)
move.l (a1)+,d6
movep.l d6,-224(a2)
move.l (a1)+,d6
movep.l d6,-216(a2)
move.l (a1)+,d6
movep.l d6,-208(a2)
move.l (a1)+,d6
movep.l d6,-200(a2)
move.l (a1)+,d6
movep.l d6,-192(a2)
move.l (a1)+,d6
movep.l d6,-184(a2)
move.l (a1)+,d6
movep.l d6,-176(a2)
move.l (a1)+,d6
movep.l d6,-168(a2)
move.l (a1)+,d6
movep.l d6,-160(a2)
move.l (a1)+,d6
movep.l d6,-152(a2)
move.l (a1)+,d6
movep.l d6,-144(a2)
move.l (a1)+,d6
movep.l d6,-136(a2)
move.l (a1)+,d6
movep.l d6,-128(a2)
move.l (a1)+,d6
movep.l d6,-120(a2)
move.l (a1)+,d6
movep.l d6,-112(a2)
move.l (a1)+,d6
movep.l d6,-104(a2)
move.l (a1)+,d6
movep.l d6,-96(a2)
move.l (a1)+,d6
movep.l d6,-88(a2)
move.l (a1)+,d6
movep.l d6,-80(a2)
move.l (a1)+,d6
movep.l d6,-72(a2)
move.l (a1)+,d6
movep.l d6,-64(a2)
move.l (a1)+,d6
movep.l d6,-56(a2)
move.l (a1)+,d6
movep.l d6,-48(a2)
move.l (a1)+,d6
movep.l d6,-40(a2)
move.l (a1)+,d6
movep.l d6,-32(a2)
move.l (a1)+,d6
movep.l d6,-24(a2)
move.l (a1)+,d6
movep.l d6,-16(a2)
move.l (a1)+,d6
movep.l d6,-8(a2)
bit8_put02:
move.w d4,d1
beq bit8_put04
subq.w #1,d1
moveq.l #0,d0
bit8_put03:
move.b (a1)+,(a2,d0.w)
addq.l #2,d0
dbra.w d1,bit8_put03
bit8_put04:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
dbra d7,bit8_put01
rts
bit8_put30: *MC68030以上用(タブソ)
lsr.w #2,d0 *1/4
subq.w #1,d0
bit8_put31:
move.w d0,d1
bit8_put32:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,bit8_put32
move.w d4,d1
beq bit8_put34
subq.w #1,d1
bit8_put33:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,bit8_put33
bit8_put34:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
dbra.w d7,bit8_put31
rts
bit8_put60: *転送もとアドレスが奇数の時
subq.w #1,d0 *転送横サイズが4未満の時
bit8_put61:
move.w d0,d1
bit8_put62:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,bit8_put62
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
dbra.w d7,bit8_put61
rts
bit8_putk: *転送もとアドレスが奇数の時
cmpi.w #5,d0 *転送横サイズが5以下か
bcs bit8_put60 *そう
subq.w #1,d0
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
lsr.w #2,d0
subq.w #1,d0
bit8_putk1:
move.b (a1)+,(a2)
addq.l #2,a2
move.w d0,d1
bit8_putk2:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,bit8_putk2
move.w d4,d1
beq bit8_putk4
subq.w #1,d1
bit8_putk3:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,bit8_putk3
bit8_putk4:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
dbra.w d7,bit8_putk1
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
clr.w x_old
clr.w y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
* bsr mouse_chk *マウスからの入力チェック
tst.b esc_flg *エスケープ入力有るか
bne scroll9 *指定有り
tst.b next_flg *ネクスト入力有るか
bne scroll9 *指定有り
bsr wait_chk *ウェイト値の変更チェック
bsr cursor_chk *カーソルキーからの入力チェック
bsr tenkey_chk *テンキー入力チェック
bsr mouse_chk *マウスからの入力チェック
bsr _PageSync *768x512 256色モード
bsr go_scroll
bra scroll2 *キー入力に戻る
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk *マウスからの入力チェック
scroll9:
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
move.w s_dot8(pc),-(sp)
lsr.w s_dot8
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr _PageSync *768x512 256色モード
bsr down
cmp.w y_max(pc),d3
bne down_demo0
down_demo8:
move.w (sp)+,s_dot8
down_demo9:
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot8(pc),-(sp)
lsr.w s_dot8
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr _PageSync *768x512 256色モード
bsr right
cmp.w x_max(pc),d2
bne right_demo0
right_demo8:
move.w (sp)+,s_dot8
right_demo9:
rts
*****************************************************************
* ウェイト値の変更チェック *
*****************************************************************
wait_chk:
movea.l #$800,a0
btst.b #2,8(a0) *'-'が押されたか?
beq wait_chk1
tst.b inkey_flg3
bne wait_chk9
st inkey_flg3
subq.w #1,_Wait
bpl wait_chk9
clr.w _Wait
bra wait_chk9
wait_chk1:
btst.b #6,8(a0) *'+'
beq wait_chk8
tst.b inkey_flg3
bne wait_chk9
st inkey_flg3
addq.w #1,_Wait
cmp.w #4096,_Wait
bls wait_chk9
move.w #4096,_Wait
bra wait_chk9
wait_chk8:
sf inkey_flg3
wait_chk9:
rts
*****************************************************************
* スクロール *
*****************************************************************
go_scroll:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 右下(手抜き) *
*****************************************************************
right_down:
bsr right
bsr down
rts
*****************************************************************
* 左下(手抜き) *
*****************************************************************
left_down:
bsr left
bsr down
rts
*****************************************************************
* 右上(手抜き) *
*****************************************************************
right_up:
bsr right
bsr up
rts
*****************************************************************
* 左上(手抜き) *
*****************************************************************
left_up:
bsr left
bsr up
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot8(pc),d2
* tst.w d2
bpl left1
clr.w d2
left1:
move.w x_old(pc),d5 *何ドットずらすか
sub.w d2,d5
beq left9
bsr x_set
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,bmp_x
move.w d5,bmp_xd
move.w y_old(pc),bmp_y
move.w y_line(pc),bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
adda.l #GRAM,a2
move.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq left8
bsr get_bmp_addr
adda.l #256,a1
bsr get_gram_addr
adda.l #$c80000,a2
move.l #$d00000,a5
bsr g8 *裏の表示
left8:
move.w d2,x_old
left9:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot8(pc),d3
* tst.w d3
bpl up1
clr.w d3
up1:
move.w y_old(pc),d6 *何ドットずらすか
sub.w d3,d6
beq up9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),bmp_x
move.w x_line(pc),bmp_xd
move.w d3,bmp_y
move.w d6,bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
adda.l #GRAM,a2
move.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq up8
move.w x_old(pc),d0 *表示開始X座標補正
add.w x_pos_bk(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w x_line_bk(pc),bmp_xd *ドット数補正
bsr get_bmp_addr
adda.w x_sabun_bk(pc),a1
bsr get_gram_addr
adda.l #$c80000,a2
move.l #$d00000,a5
bsr g8 *裏の表示
bsr y_set
up8:
move.w d3,y_old
up9:
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot8(pc),d2
cmp.w x_max(pc),d2
bls right1
move.w x_max(pc),d2
right1:
move.w d2,d5 *何ドットずらすか
sub.w x_old(pc),d5
beq right9
bsr x_set
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
add.w #512,d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),bmp_x
add.w #512,bmp_x
move.w d5,bmp_xd
move.w y_old(pc),bmp_y
move.w y_line(pc),bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
adda.l #GRAM,a2
move.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq right8
bsr get_bmp_addr
adda.l #256,a1
bsr get_gram_addr
adda.l #$c80000,a2
move.l #$d00000,a5
bsr g8 *裏の表示
right8:
move.w d2,x_old
right9:
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot8(pc),d3
cmp.w y_max(pc),d3
bls down1
move.w y_max(pc),d3
down1:
bsr y_set
move.w d3,d6 *何ドットずらすか
sub.w y_old(pc),d6
beq down9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),bmp_x
move.w x_line(pc),bmp_xd
move.w y_old(pc),bmp_y
add.w #512,bmp_y
move.w d6,bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
adda.l #GRAM,a2
move.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq down8
move.w x_old(pc),d0 *表示開始X座標補正
add.w x_pos_bk(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w x_line_bk(pc),bmp_xd *ドット数補正
bsr get_bmp_addr
adda.w x_sabun_bk(pc),a1
bsr get_gram_addr
adda.l #$c80000,a2
move.l #$d00000,a5
bsr g8 *裏の表示
down8:
move.w d3,y_old
down9:
rts
*****************************************************************
* 画面の描き直し *
*****************************************************************
esc_rewrite:
move.w x_pos(pc),gram_x *表示開始X座標
move.w y_pos(pc),gram_y *表示開始Y座標
move.w d2,bmp_x
move.w x_line(pc),bmp_xd
move.w d3,bmp_y
move.w y_line(pc),bmp_yd
clr.w d2
clr.w d3
bsr x_set
bsr y_set
bsr get_bmp_addr
bsr get_gram_addr
adda.l #GRAM,a2
bsr bit8_put *表の表示
tst.w x_line_bk *裏を表示するか
beq rewrite_end
move.w x_pos_bk(pc),gram_x *表示開始X座標補正
move.w x_line_bk(pc),bmp_xd *ドット数補正
bsr get_bmp_addr
adda.w x_sabun_bk(pc),a1
bsr get_gram_addr
adda.l #$c80000,a2
bsr bit8_put *裏の表示
rewrite_end:
rts
*****************************************************************
* スクロール分のグラフィックを表示する *
* gram_x, gram_y 表示先座標(GRAM) *
* bmp_x, bmp_y 表示元座標(BMP) *
* bmp_xd, bmp_yd ドット数 *
*****************************************************************
g8:
move.w bmp_xd(pc),d0 *横ドット数
move.w bmp_yd(pc),d7 *縦ドット数
movea.w line_byte(pc),a3 *次のラインへのバイト数
adda.w d0,a3 *(転送元)
movea.l #512,a4 *表示データの1ライン下までの差分
suba.w d0,a4 *(表示先)
adda.l a4,a4
move.w gram_x(pc),d6 *左右2回に分けての表示か
add.w bmp_xd(pc),d6
cmp.w #512,d6
bhi g8_3 *そう
cmpi.b #MC68060,MPUTYPE *MC68060か
bcc g8_60
cmpi.w #4,d0 *転送横サイズが4未満か
bcs g8_60
move.l a1,d6 *転送もとが奇数アドレスか
btst.l #0,d6
bne g8_k
g8_1:
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
lsr.w #2,d0
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
addq.l #1,a2 *転送先を奇数アドレスにする
g8_11:
move.w d0,d1
g8_12:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,g8_12
move.w d4,d1
beq g8_14
subq.w #1,d1
g8_13:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,g8_13
g8_14:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_15
suba.l #$80000,a2
g8_15:
dbra d7,g8_11
rts
g8_3: *左右2回に分けて表示
add.l #1024,a4 *1ライン下までの差分を補正
move.w #512,d0 *横ドット1
sub.w gram_x(pc),d0
move.w bmp_xd(pc),d6 *横ドット2
sub.w d0,d6
subq.w #1,d0
subq.w #1,d6
subq.w #1,d7
addq.l #1,a2 *転送先を奇数アドレスにする
g8_30:
move.w d0,d1 *右側
g8_31:
move.b (a1)+,(a2)
addq.l #2,a2
dbra d1,g8_31
g8_32:
move.w d6,d1 *左側
lea.l -1024(a2),a2
g8_33:
move.b (a1)+,(a2)
addq.l #2,a2
dbra d1,g8_33
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_34
suba.l #$80000,a2
g8_34:
dbra d7,g8_30
rts
g8_k:
cmpi.w #5,d0 *転送横サイズが5以下か
bls g8_60 *そう
subq.w #1,d0
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
lsr.w #2,d0
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
addq.l #1,a2 *転送先を奇数アドレスにする
g8_k1:
move.b (a1)+,(a2)
addq.l #2,a2
move.w d0,d1
g8_k2:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,g8_k2
move.w d4,d1
beq g8_k4
subq.w #1,d1
g8_k3:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,g8_k3
g8_k4:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_k5
suba.l #$80000,a2
g8_k5:
dbra d7,g8_k1
rts
g8_60:
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
addq.l #1,a2 *転送先を奇数アドレスにする
g8_61:
move.w d0,d1
g8_62:
move.b (a1)+,(a2)
addq.l #2,a2
dbra d1,g8_62
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_63
suba.l #$80000,a2
g8_63:
dbra d7,g8_61
rts
*****************************************************************
* BMPデータのアドレスを取得 *
*****************************************************************
get_bmp_addr:
move.w tate(pc),d0 *グラフィックデータの先頭
subq.w #1,d0 *(tate-1-bmp_y)*line_byte+bmp_x+gr_addr
sub.w bmp_y(pc),d0
mulu.w line_byte(pc),d0
add.l gr_addr(pc),d0
movea.l d0,a1
adda.w bmp_x(pc),a1
rts
*****************************************************************
* GRAMのアドレスを取得 *
*****************************************************************
get_gram_addr:
move.w gram_x(pc),d0 *表示先画像アドレス
move.w gram_y(pc),d1 *gram_y*1024+gram_x*2
swap.w d1
clr.w d1
ror.l #6,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
rts
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
dpal_buf:
.ds.b 256*2*4*4
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
bmp_x .ds.w 1 *表示する座標(BMP)
bmp_y .ds.w 1
bmp_xd .ds.w 1 *表示するドット数
bmp_yd .ds.w 1
x_line:
.ds.w 1 *表画面の横ドット数
y_line:
.ds.w 1 *縦ドット数
x_line_bk:
.ds.w 1 *裏画面の横ドット数
x_pos_bk:
.ds.w 1 *裏画面の表示位置X
x_sabun_bk:
.ds.w 1 *表画面と裏画面のX方向の差分
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
.even